package cn.itsource.closeio;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;

import cn.itsource.util.IoUtil;

/**
	jdk7关流新方式： 用新结构可以自动关流
	前提：该流必须是实现了一个接口	AutoCloseable	
		try(
			//只能写创建流的操作，不能写其他业务操作
		){
			//可能有异常的代码
		}catch(异常类型1 e){
			
		}...不需要finally关流了
 */
public class ChangeIo {

	public static void main(String[] args) {
		try (
			//只能写创建流的操作，不能写其他业务操作
			FileInputStream fis = new FileInputStream("MyEclipse快捷键.txt");
			FileOutputStream fos = new FileOutputStream("MyEclipse快捷键-copy.txt");
		){
			//可能有异常的代码
			copyFile(fis,fos);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e1) {
			e1.printStackTrace();
		} 
	}
	
	/**
	 * 需求：别人给我们提供了一个字节输入流和字节输出流，我们却要复制文本文件。
	 * 将字节流转包装为转换流
	 */
	public static void copyFile(InputStream is,OutputStream os) {
		if (is == null || os == null) {
			throw new IllegalArgumentException("参数不能为null");
		}
		try(
			//只能写创建流的操作，不能写其他业务操作
			InputStreamReader isr = new InputStreamReader(is);
			OutputStreamWriter osw  = new OutputStreamWriter(os);
		) {
			//可能有异常的代码
			char[] c = new char[1024];//这里不是1k	每次读取的数据装到该char数组
			int read = -1;//每一次真正读取的字符个数
			//复制文件，应该一边读取，一边直接写出
			while ((read = isr.read(c)) != -1) {
				//将读取char数组中的数据，写出去。读了多少个字符就写出多少个字符
				osw.write(c, 0, read);
			}
			osw.flush();//刷新，将内存中的数据写出到硬盘
			System.out.println("复制成功！");
		} catch (FileNotFoundException e) {
			System.out.println("文件未找到！");
			e.printStackTrace();
		} catch (IOException e) {
			System.out.println("复制失败！");
			e.printStackTrace();
		}
	}
	
}
